//  函数默认值，在默认值后面不能再添加无默认值的变量
{
    function test (x, y = 'world') {
        console.log('默认值', x, y);
    }
    test()
    test('hello')
    test('hello', 'kill')
}

//  函数作用域
//  如果函数默认值为(x,y=x)，外面的x不影响函数内赋值，默认值只在{}作用域内生效
//  如果函数默认值为(c,y=x)，此时y等于外层x
{
    let x = 'test';
    function test2 (c, y = x) {
        console.log('作用域', c, y);
    }
    test2();
    test2('kill');
}

//  rest参数
//  在不确定参数的情况下，把参数转为数组
{
    function test3 (...arg) {
        for (let v of arg) {
            console.log('rest', v)
        }
    }
    test3(1, 2, 3, 4, 'a');
}

//  把数组拆分成3个值
{
    console.log(...[1, 2, 4]);
    console.log('a', ...[1, 2, 4]);
}

//  箭头函数
{
    let arrow = v => v * 2;
    let arrow2 = () => 5;
    console.log(arrow(3))
    console.log(arrow2())
}

//  尾调用
{
    function tail (x) {
        console.log('tail', x);
    }
    function fx (x) {
        return tail(x);
    }
    fx(123);
}